package com.sfx.concurrent.demo.concurrent.SingletonTest;

/**
 * 饿汉式
 */
public class Singleton1 {
    private Singleton1() {
        System.out.println("Singleton1()");
    }
    // 问题1：为什么加 final
    // 怕有子类, 子类可以覆盖父类的方法,破坏单例
    // 问题3：为什么设置为私有? 是否能防止反射创建新的实例?
    // 因为不设置私有就不是单例了,可以创建多个对象了 , 不能 -> if(INSTANCE!=NULL)
    // 问题2：如果实现了序列化接口, 还要做什么来防止反序列化破坏单例
    // 加一个readResolve方法
    // 问题4：这样初始化是否能保证单例对象创建时的线程安全?
    //被static修饰的变量都是在静态代码块里面执行,静态代码块里面的线程安全问题是由JVM来保证的
    private static final Singleton1 INSTANCE = new Singleton1();
    // 问题5：为什么提供静态方法而不是直接将 INSTANCE 设置为 public, 说出你知道的理由
    //提供更好的封装性,内部可以实现懒惰的初始化方式,可以对创建单例对象有更多的控制, 支持泛型
    public static Singleton1 getInstance() {
        return INSTANCE;
    }
}